//C15.11:error4.cpp --- using exception classes
#include <iostream>
#include <cmath>    // or math.h, unix useres may need -lm flag
#include "exc_mean.h"

// function prototypes
double hmean(double a, double b);
double gmean(double a, double b);

int main(void)
{
    using std::cout;
    using std::cin;
    using std::endl;

    double x, y, z;
    cout << "Enter two numbers: ";
    while(cin >> x >> y)
    {
        try{                // start of try block
            z = hmean(x,y);
            cout << "Harmonic mean of " << x << " and " << y
                 << " is " << z << endl;
            cout << "Geometric mean of " << x << " and " << y
                 << " is " << gmean(x,y) << endl;     
            cout << "Enter next set of numbers <q to quit>: ";     
        }                  // end of try block
        catch(bad_hmean & bg)    // start of catch block
        {
            bg.mesg();
            cout << "Try again.\n";
            continue;
        }
        catch(bad_gmean & hg)
        {
            cout << hg.mesg();
            cout << "Value used: " << hg.v1 << ", "
                 << hg.v2 << endl;
            cout << "Sorry, your don't get to play any more.\n";     
            break;
        }                       // end of catch block
    }
    cout << "Bye!\n";
}

double hmean(double a, double b)
{
    if(a == -b)
    {
        throw bad_hmean(a,b);
    }
    return 2.0 * a * b / (a + b);
}

double gmean(double a, double b)
{
    if(a < 0 || b < 0)
    {   
        throw bad_gmean(a,b);
    }
    return std::sqrt(a * b);
}